/*
 * Connection.h
 *
 *  Created on: 30/04/2011
 *      Author: dela
 */

#ifndef CONNECTION_H_
#define CONNECTION_H_

#include "Thread.h"
#include "Socket.h"
#include "Mutex.h"
#include "../dominio/Juego.h"
#include "../dominio/Personaje.h"

class Server;

class Connection: public Thread {
protected:
	virtual void run();
private:
	Juego *juego;
	Personaje *personaje;
	bool working;
	Mutex workingMutex;
	Socket aSocket;
	string pathJuego;

	Server *server;

	int clientesEsperando;
	bool *gameStart;
	Mutex *gameStartMutex;
	pthread_cond_t *gameStartCond;

	void setWorking(bool working);

	void waitForStart();

	bool sendGameInfo();

	bool actualizarEstadoTeclas();

	string getOtroPersonaje();

	bool sendOtroPersonaje();

	void quitoPersonaje();
public:
	Connection( unsigned int sockfd ) : aSocket(sockfd) {};

	Connection( unsigned int sockfd, Juego *j, bool *gs, Mutex *gsm, pthread_cond_t *gsc, int ce, string pj, Server *sr) :
		juego(j), aSocket(sockfd), pathJuego(pj), server(sr) {working = false; gameStart = gs; gameStartMutex = gsm; gameStartCond = gsc; personaje = NULL; clientesEsperando = ce;
			arriba = false;abajo = false;izq = false;der = false;};

	virtual ~Connection() {};

	bool isWorking();

	/**
	 * Cierra la coneccion.
	 */
	void connectionShutdown();

	void sendData(string &data);
	string *recvData();

	Personaje* inicializarPersonaje(string nombreProtagonista, Juego *juego, int coordx, int coordy, string animacionActual);

	Personaje* getPersonaje() {return personaje;};

	//Teclas presionadas en el cliente:
	bool arriba;
	bool abajo;
	bool izq;
	bool der;
};

#endif /* CONNECTION_H_ */
